package cn.tedu.charging.order.service.impl;

import cn.tedu.charging.common.pojo.JsonResult;
import cn.tedu.charging.common.pojo.param.GunStatusUpdateParam;
import cn.tedu.charging.common.pojo.vo.StationInfoVO;
import cn.tedu.charging.common.pojo.vo.UserInfoVO;
import cn.tedu.charging.order.common.GunStatusConstants;
import cn.tedu.charging.order.feign.DeviceClient;
import cn.tedu.charging.order.feign.UserClient;
import cn.tedu.charging.order.pojo.param.OrderAddParam;
import cn.tedu.charging.order.service.OrderService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.ParameterizedTypeReference;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

import java.util.Random;

@Slf4j
@Service
public class OrderServiceImpl implements OrderService {

    /**
     * 1. 生成 订单号 生成的逻辑
     * 2. 修改 充电枪 的状态 为 使用中
     * 3. 获取 用户信息 （车辆id）  (微服务架构  订单服务 调用 用户服务 服务之间通信)
     * 4. 获取 服务信息  （场站信息 和 设备信息 充电站id, 运营商id ... ） (微服务架构  订单服务调用 设备服务 服务之间通信)
     * 5. 订单服务 给 设备 发送开始充电指令  （物联网 订单服务 调用 充电桩设备 服务与 设备之间通信）
     * @param orderAddParam
     * @return
     */
    @Override
    public String createOrder(OrderAddParam orderAddParam) {
        log.debug("创建订单-orderService:入参:{}", orderAddParam);
        //1 生成订单号
        log.debug("创建订单-orderService:生成订单号");
        String orderNo = getOrderNo();
        log.debug("创建订单-orderService:生成订单号:{}", orderNo);

        //2 获取用户信息 车辆id
        Integer userId = orderAddParam.getUserId();
        log.debug("创建订单-orderService:获取用户信息:入参:{}", userId);
        UserInfoVO userInfo = getUserInfoByOpenFeign(userId);
        log.debug("创建订单-orderService:获取用户信息:入参:{},出参:{}", userId,userInfo);

        //3 修改 充电枪 的状态 为 使用中
        // 1 使用中 魔数 应该定义为常量或者枚举
        log.debug("创建订单-orderService:修改枪的状态为使用中:入参:枪id:{},状态:{}",
                orderAddParam.getGunId(),GunStatusConstants.GUN_STATUS_USING);
        Boolean success = updateGunStatus(orderAddParam.getGunId(),
                GunStatusConstants.GUN_STATUS_USING);
        log.debug("创建订单-orderService:修改枪的状态为使用中:入参:枪id:{},状态:{},出参:{}",
                orderAddParam.getGunId(),GunStatusConstants.GUN_STATUS_USING,success);

        //4 获取 场站信息
        log.debug("创建订单-orderService:获取场站信息:入参:{}", orderAddParam.getGunId());
        StationInfoVO stationInfo = getStationInfo(orderAddParam.getGunId());
        log.debug("创建订单-orderService:获取场站信息:入参:{},出参:{}", orderAddParam.getGunId(),stationInfo);

        log.debug("创建订单-orderService:入参:{},出参:{}", orderAddParam,orderNo);
        return orderNo;
    }

    @Autowired
    private RestTemplate restTemplate;
    @Autowired
    private UserClient userClient;
    @Autowired
    private DeviceClient deviceClient;

    /**
     * 获取场站信息
     */
    private StationInfoVO getStationInfo(Integer gunId) {
        JsonResult<StationInfoVO> result = deviceClient.getStationInfo(gunId);
        if (result != null) {
            return result.getData();
        }
        return null;
    }

    /**
     * 更新枪的状态
     */
    private Boolean updateGunStatus(Integer gunId, Integer status) {
        GunStatusUpdateParam param = new GunStatusUpdateParam();
        param.setGunId(gunId);
        param.setStatus(status);
        JsonResult<Boolean> result = deviceClient.updateGunStatus(param);
        if (result != null) {
            return result.getData();
        }
        return false;
    }

    /*
    * 获取用户信息
    * */
    private UserInfoVO getUserInfoByOpenFeign(Integer userId){
        JsonResult<UserInfoVO> userInfo =
                userClient.getUserInfo(userId);
        UserInfoVO data = userInfo.getData();
        return data;
    }

    /**
     * 通过用户id 获取用户信息
     * @param userId
     * @return
     */
    private UserInfoVO getUserInfo(Integer userId) {
        String url = getRandomUrl();
        log.debug("随机获取的用户服务的URL:{}", url);
        //String url = "http://localhost:8080/user/info/{userId}";

        ParameterizedTypeReference<JsonResult<UserInfoVO>> repType =
                new ParameterizedTypeReference<JsonResult<UserInfoVO>>() {
                };

        ResponseEntity<JsonResult<UserInfoVO>> entity = restTemplate.
                exchange(url, HttpMethod.GET, null, repType, userId);

        JsonResult<UserInfoVO> body = entity.getBody();
        UserInfoVO data = body.getData();
        return data;
    }

    private String getRandomUrl() {
        String url = "http://localhost:8080/user/info/{userId}";
        String url1 = "http://localhost:8081/user/info/{userId}";
        String url2 = "http://localhost:8082/user/info/{userId}";

        String[] urls = {url,url1,url2};
        //String[] urls = new String[]{url,url1,url2};
        Random random = new Random();
        int index = random.nextInt(urls.length);
        return urls[index];
    }


    /**
     * 生成订单号
     * @return
     */
    private String getOrderNo(){
        return "666";
    }

}
